package jp.anago_dev.takarush_helper.database;

import jp.anago_dev.takarush_helper.database.DatabaseParameter.LocationColumn;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * データベース構築のヘルパークラスです。<br/>
 * シングルトンパターンを利用しています。
 * 
 * @author anago_dev
 * 
 */
public class DatabaseHelper extends SQLiteOpenHelper {

    /** インスタンス */
    private static DatabaseHelper sInstance;

    /**
     * オブジェクトを取得します。
     * 
     * @param context
     * @return
     */
    public static DatabaseHelper getInstance(final Context context) {

        if (sInstance == null) {
            // 必ずApllicationContextを設定する。(メモリリーク対策)
            sInstance = new DatabaseHelper(context.getApplicationContext());
        }
        return sInstance;
    }

    /**
     * オブジェクトの破棄を行います。
     */
    public static void destroyInstance() {
        sInstance = null;
    }

    /**
     * コンストラクタ
     * 
     * @param context
     *            コンテキスト
     */
    private DatabaseHelper(final Context context) {

        super(context, DatabaseParameter.DATABASE_NAME, null, DatabaseParameter.DATABASE_VERSION);
    }

    /**
     * @see android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase)
     */
    @Override
    public void onCreate(final SQLiteDatabase db) {

        // 位置情報SQL文構築
        final StringBuilder sql = new StringBuilder();
        sql.append("CREATE TABLE ");
        sql.append(LocationColumn.TABLE_NAME);
        sql.append(" (");
        sql.append("_ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,");
        sql.append(LocationColumn.LATITUDE);
        sql.append(" TEXT,");
        sql.append(LocationColumn.LONGITUDE);
        sql.append(" TEXT,");
        sql.append(LocationColumn.TIME);
        sql.append(" TEXT,");
        sql.append(LocationColumn.ACCURACY);
        sql.append(" TEXT");
        sql.append(" );");

        execCreateDatabase(db, sql.toString());

    }

    /**
     * @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase,
     *      int, int)
     */
    @Override
    public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {

        // バージョンが異なっている場合は再構築
        if (oldVersion != DatabaseParameter.DATABASE_VERSION) {
            db.execSQL("DROP TABLE IF EXISTS " + LocationColumn.TABLE_NAME);
            onCreate(db);
        }

    }

    /**
     * データベースの構築を行います。
     * 
     * @param db
     *            データベース
     * @param sql
     *            SQL文
     */
    private static final void execCreateDatabase(final SQLiteDatabase db, final String sql) {

        db.beginTransaction();
        try {
            db.execSQL(sql);
            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }

    }

}
